#pragma once

#include <string>
#include <vector>
#include <functional>
#include <thread>
#include <mutex>
#include <atomic>
#include <condition_variable>
#include <queue>

/**
 * 串口通信类
 * 用于与飞控建立串口连接并读取IMU数据
 */
class SerialPort {
 public:
  // 串口配置参数
  struct Config {
    std::string port;  // 串口设备名
    int baudRate;      // 波特率
    int dataBits;      // 数据位 (5-8)
    int stopBits;      // 停止位 (1-2)
    int parity;        // 校验位 (0=None, 1=Odd, 2=Even)
    int flowControl;   // 流控制 (0=None, 1=Software, 2=Hardware)

    // 默认配置
    Config()
        : port("/dev/ttyUSB0"),
          baudRate(115200),
          dataBits(8),
          stopBits(1),
          parity(0),
          flowControl(0) {}
  };

  // 构造与析构
  SerialPort();
  explicit SerialPort(const Config &config);
  ~SerialPort();

  // 禁止拷贝
  SerialPort(const SerialPort &) = delete;
  SerialPort &operator=(const SerialPort &) = delete;

  // 打开/关闭串口
  bool open(const Config &config);
  bool open(const std::string &port, int baudRate = 115200);
  void close();
  bool isOpen() const;

  // 读写操作
  int write(const uint8_t *data, size_t size);
  int write(const std::vector<uint8_t> &data);
  int read(uint8_t *buffer, size_t size);
  std::vector<uint8_t> read(size_t maxSize);

  // 设置超时
  void setTimeout(int milliseconds);

  // 清空缓冲区
  void flush();

  // 设置数据接收回调
  using DataCallback = std::function<void(const std::vector<uint8_t> &)>;
  void setDataCallback(DataCallback callback);

  // 开始/停止异步读取
  bool startReading();
  void stopReading();

 private:
  // 平台相关的串口句柄
#ifdef _WIN32
  void *handle_;
#else
  int fd_;
#endif

  Config config_;
  bool isOpen_;
  int timeout_;

  // 异步读取相关
  std::thread readThread_;
  std::atomic<bool> isReading_;
  DataCallback dataCallback_;

  // 内部读线程函数
  void readThreadFunc();
};